//package com.javabasic;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.ArrayBlockingQueue;
//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.ThreadPoolExecutor;
//
///**
// * @author mir.xiong
// * @version 1.0
// * @description
// * @see
// * @since Created by work on 2021/12/6 9:44 下午
// */
//public class Test4 {
//}
//
//
///*
// 问题：请用JAVA模拟银行账户款项的存取功能。
//允许多个账户同时往同一个账户打钱，
//每个账户最多可存1000w元。
//允许多个端同时从同一个账户取钱，但不允许透支
//*/
//解：
//
///*
// 问题：编写信息发送程序，至少运用工厂模式、策略模式两种设计模式。（考察设计模式和基础线程编码）
//用户端（多用户并行提交）输入如下信息：
//接收人：
//内容：
//发送方式：短信、邮件、钉钉消息
//
//需要对不同类型的发送方式进行校验：
//短信：字数不能大于100，只能发文本
//邮件：无字数限制，可以文本+图片
//钉钉：无字书限制，可以发文本、图片和文件附件
//
//约束条件：
//由于服务器资源优先，最多只能支持100个线程
//有统一的发送接口，只需传入参数即可调用发送，发送接口同一时刻只能发调用一次
//*/
//public class Test1 {
//
//    /**
//     * 模拟数据准备过程
//     * @return
//     */
//    public static List<Message> dataProvider() {
//        List<Message> messages = new ArrayList<>();
//        final int MESSAGE_SIZE = 10000;
//        for (int i = 0; i < MESSAGE_SIZE; i++) {
//            messages.add(new Message());
//        }
//    }
//
//    public static void main(String[] args) {
//        List<Message> messageList = dataProvider();
//        int coreSize = Runtime.getRuntime().availableProcessors() * 2;
//        int maxSize = 100;
//        BlockingQueue<Runnable> messages = new ArrayBlockingQueue<Runnable>(1000);
//        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(coreSize, maxSize, 60, TimeUnit.SECONDS, messages);
//        if (null != messageList && !messageList.isEmpty()) {
//            for (Message message : messageList) {
//                threadPoolExecutor.submit(message);
//            }
//        }
//
//    }
//}
//@Data
//@NoArgsConstructor
//@AllArgsConstructor
//class Message implements Runnable{
//    protected String receiver;
//    protected List<MsgContent> content;
//
//    @Override
//    public void run() {
//        synchronized (Message.class) {
//            // todo 调用发送信息的接口
//        }
//    }
//}
//
///**
// * 文本内容
// */
//interface MsgContent {
//
//}
//
//class TxtContent implements MsgContent {
//    int size;
//}
//
//class ImageContent implements MsgContent {
//
//}
//
//class AttachContent implements MsgContent {
//
//}
//
//interface CheckInterface{
//    default boolean checkMessage(Message message) {
//        boolean result = true;
//        result = checkEmpty(message);
//        if (!result) {
//            return result;
//        }
//        result = execCheck(message);
//        return result;
//    }
//
//    boolean execCheck(Message message);
//
//    default boolean checkEmpty(Message message) {
//        List<MsgContent> content = message.getContent();
//        if (null == content || content.isEmpty()) {
//            return true;
//        }
//        return false;
//    }
//}
//class ShortMessage extends Message implements CheckInterface {
//
//    @Override
//    public boolean execCheck(Message message) {
//        TxtContent txtContent = null;
//        for (MsgContent msgContent : content) {
//            if (!(content instanceof TxtContent)) {
//                return false;
//            }
//            txtContent = (TxtContent) content;
//            if (txtContent.size > 100) {
//                return false;
//            }
//        }
//        return true;
//    }
//}
//
//class EmailMessage extends Message implements CheckInterface {
//
//
//    @Override
//    public boolean execCheck(Message message) {
//        TxtContent txtContent = null;
//        for (MsgContent msgContent : content) {
//            if ((content instanceof TxtContent) || (content instanceof ImageContent)) {
//                continue;
//            } else {
//                return false;
//            }
//        }
//        return true;
//    }
//}
//
//
//class DingDingMessage extends Message implements CheckInterface {
//    @Override
//    public boolean execCheck(Message message) {
//        TxtContent txtContent = null;
//        for (MsgContent msgContent : content) {
//            if ((content instanceof TxtContent) || (content instanceof ImageContent) || (content instanceof AttachContent)) {
//                continue;
//            } else {
//                return false;
//            }
//        }
//        return true;
//    }
//}
//
///*
// 问题：红包分配算法，手气红包，金额为M的红包，N个人领。自己觉得算法合适就行
//*/
//算法一：均分
//
//        算法二：
//        1. 随机取[0-n](边界值不允许取)的一个数作为第一个人得到的红包X1
//        2. 随机取[0-(n-X1)](边界值不允许取)的一个数作为第二个人得到的红包X2
//        3. 随机取[0-(n-X1-X2)](边界值不允许取)的一个数作为第三个人得到的红包X3
//        依次计算。。。
//        当到最后一个人的时候，把现有剩余的钱均给他
//
//        算法三：根据正态分布，来分配m个人的红包
